package service;

import data.*;
import java.util.List;

/**
 * 碰撞检测服务类
 */
public class CollisionService {
    // -------------------- service --------------------
    private GameRuntimeData runtimeData;

    public CollisionService() {
        this.runtimeData = GameRuntimeData.getInstance();
    }

    /**
     * *难点1
     * 功能: 检查所有碰撞
     * 检查子弹与坦克碰撞
     * 检查子弹与方块碰撞
     * 检查子弹与大本营碰撞
     * 参数: void
     * 返回值: void
     */
    public void checkAllCollisions() {
        checkBulletTankCollisions();
        checkBulletBlockCollisions();
        checkBulletCampCollisions();
    }

    /**
     * 负责人: 张三
     * 功能: 检查子弹与坦克碰撞
     * 我方子弹与敌方坦克
     * 敌方子弹与我方坦克
     * 参数: void
     * 返回值: void
     */
    private void checkBulletTankCollisions() {
        // 我方子弹与敌方坦克碰撞
        if (runtimeData.getHero() != null && runtimeData.getHero().getState() == 1) {
            for (BulletData bullet : runtimeData.getHero().getBulletPool()) {
                if (bullet.getState() == 1) {
                    for (EnemyData enemy : runtimeData.getEnemyPool()) {
                        if (enemy.getState() == 1 && rectCollideRect(
                                bullet.getX(), bullet.getY(), bullet.getWidth(), bullet.getHeight(),
                                enemy.getX(), enemy.getY(), 40, 40)) {
                            // 处理碰撞
                            enemy.setHp(enemy.getHp() - bullet.getAtk());
                            bullet.setState(0); // 子弹消失

                            // 创建爆炸效果
                            createExplosion(enemy.getX(), enemy.getY());

                            if (enemy.getHp() <= 0) {
                                enemy.setState(0); // 坦克死亡
                                runtimeData.incrementEnemyDeadNum();
                                runtimeData.setScore(runtimeData.getScore() + 100);
                            }
                            break;
                        }
                    }
                }
            }
        }

        // 敌方子弹与我方坦克碰撞
        for (EnemyData enemy : runtimeData.getEnemyPool()) {
            if (enemy.getState() == 1) {
                for (BulletData bullet : enemy.getBulletPool()) {
                    if (bullet.getState() == 1 && runtimeData.getHero() != null && runtimeData.getHero().getState() == 1) {
                        if (rectCollideRect(
                                bullet.getX(), bullet.getY(), bullet.getWidth(), bullet.getHeight(),
                                runtimeData.getHero().getX(), runtimeData.getHero().getY(), 40, 40)) {
                            // 处理碰撞
                            runtimeData.getHero().setHp(runtimeData.getHero().getHp() - bullet.getAtk());
                            bullet.setState(0); // 子弹消失

                            // 创建爆炸效果
                            createExplosion(runtimeData.getHero().getX(), runtimeData.getHero().getY());

                            if (runtimeData.getHero().getHp() <= 0) {
                                runtimeData.getHero().setState(0); // 坦克死亡
                            }
                            break;
                        }
                    }
                }
            }
        }
    }

    /**
     * 负责人: 张三
     * 功能: 检查子弹与方块碰撞
     * 参数: void
     * 返回值: void
     */
    private void checkBulletBlockCollisions() {
        List<BlockData> blocks = runtimeData.getBlockList();

        // 检查我方子弹
        if (runtimeData.getHero() != null && runtimeData.getHero().getState() == 1) {
            for (BulletData bullet : runtimeData.getHero().getBulletPool()) {
                if (bullet.getState() == 1) {
                    for (int i = blocks.size() - 1; i >= 0; i--) {
                        BlockData block = blocks.get(i);
                        if (rectCollideRect(
                                bullet.getX(), bullet.getY(), bullet.getWidth(), bullet.getHeight(),
                                block.getX(), block.getY(), block.getWidth(), block.getHeight())) {
                            bullet.setState(0); // 子弹消失
                            createExplosion(block.getX(), block.getY());

                            if (block.getBlockKind() == 1) { // 砖块可以被摧毁
                                blocks.remove(i);
                            }
                            break;
                        }
                    }
                }
            }
        }

        // 检查敌方子弹
        for (EnemyData enemy : runtimeData.getEnemyPool()) {
            if (enemy.getState() == 1) {
                for (BulletData bullet : enemy.getBulletPool()) {
                    if (bullet.getState() == 1) {
                        for (int i = blocks.size() - 1; i >= 0; i--) {
                            BlockData block = blocks.get(i);
                            if (rectCollideRect(
                                    bullet.getX(), bullet.getY(), bullet.getWidth(), bullet.getHeight(),
                                    block.getX(), block.getY(), block.getWidth(), block.getHeight())) {
                                bullet.setState(0); // 子弹消失
                                createExplosion(block.getX(), block.getY());

                                if (block.getBlockKind() == 1) { // 砖块可以被摧毁
                                    blocks.remove(i);
                                }
                                break;
                            }
                        }
                    }
                }
            }
        }
    }

    /**
     * 负责人: 张三
     * 功能: 检查子弹与大本营碰撞
     * 参数: void
     * 返回值: void
     */
    private void checkBulletCampCollisions() {
        if (runtimeData.getCamp() == null || runtimeData.getCamp().getState() == 0) return;

        // 检查敌方子弹与大本营碰撞
        for (EnemyData enemy : runtimeData.getEnemyPool()) {
            if (enemy.getState() == 1) {
                for (BulletData bullet : enemy.getBulletPool()) {
                    if (bullet.getState() == 1) {
                        if (rectCollideRect(
                                bullet.getX(), bullet.getY(), bullet.getWidth(), bullet.getHeight(),
                                runtimeData.getCamp().getX(), runtimeData.getCamp().getY(),
                                runtimeData.getCamp().getWidth(), runtimeData.getCamp().getHeight())) {
                            bullet.setState(0); // 子弹消失
                            runtimeData.getCamp().setState(0); // 大本营被摧毁
                            createExplosion(runtimeData.getCamp().getX(), runtimeData.getCamp().getY());
                            break;
                        }
                    }
                }
            }
        }
    }

    /**
     * 负责人: 张三
     * 功能: 矩形碰撞检测算法
     * 参数:
     *   x1,y1,w1,h1: 矩形1的坐标和尺寸
     *   x2,y2,w2,h2: 矩形2的坐标和尺寸
     * 返回值: true表示碰撞，false表示无碰撞
     */
    public boolean rectCollideRect(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2) {
        return !(x1 > x2 + w2 || x1 + w1 < x2 || y1 > y2 + h2 || y1 + h1 < y2);
    }

    /**
     * 负责人: 张三
     * 功能: 坦克移动碰撞检测
     * 检测坦克是否可以移动到指定方向
     * 参数:
     *   tank: 坦克数据
     *   direction: 移动方向
     * 返回值: true表示会碰撞，false表示无碰撞
     */
    public boolean checkTankMoveCollision(TankData tank, int direction) {
        int newX = tank.getX();
        int newY = tank.getY();

        // 计算新位置
        switch (direction) {
            case 0: newY -= tank.getSpeed(); break; // 上
            case 1: newX += tank.getSpeed(); break; // 右
            case 2: newY += tank.getSpeed(); break; // 下
            case 3: newX -= tank.getSpeed(); break; // 左
        }

        // 检查边界
        if (newX < 0 || newX > 760 || newY < 0 || newY > 760) {
            return true;
        }

        // 检查与方块碰撞
        for (BlockData block : runtimeData.getBlockList()) {
            if (rectCollideRect(newX, newY, 40, 40,
                    block.getX(), block.getY(), block.getWidth(), block.getHeight())) {
                return true;
            }
        }

        // 检查与大本营碰撞
        if (runtimeData.getCamp() != null && runtimeData.getCamp().getState() == 1) {
            if (rectCollideRect(newX, newY, 40, 40,
                    runtimeData.getCamp().getX(), runtimeData.getCamp().getY(),
                    runtimeData.getCamp().getWidth(), runtimeData.getCamp().getHeight())) {
                return true;
            }
        }

        // 检查与其他坦克碰撞
        if (tank.getTankKind() == 0) { // 我方坦克
            for (EnemyData enemy : runtimeData.getEnemyPool()) {
                if (enemy.getState() == 1 && rectCollideRect(newX, newY, 40, 40, enemy.getX(), enemy.getY(), 40, 40)) {
                    return true;
                }
            }
        } else { // 敌方坦克
            if (runtimeData.getHero() != null && runtimeData.getHero().getState() == 1) {
                if (rectCollideRect(newX, newY, 40, 40, runtimeData.getHero().getX(), runtimeData.getHero().getY(), 40, 40)) {
                    return true;
                }
            }

            for (EnemyData enemy : runtimeData.getEnemyPool()) {
                if (enemy != tank && enemy.getState() == 1 &&
                        rectCollideRect(newX, newY, 40, 40, enemy.getX(), enemy.getY(), 40, 40)) {
                    return true;
                }
            }
        }

        return false;
    }

    /**
     * 负责人: 张三
     * 功能: 创建爆炸效果
     * 参数:
     *   x: 爆炸X坐标
     *   y: 爆炸Y坐标
     * 返回值: void
     */
    private void createExplosion(int x, int y) {
        BombData bomb = runtimeData.getAvailableBomb();
        if (bomb != null) {
            bomb.setX(x);
            bomb.setY(y);
            bomb.setState(1);
            bomb.setBombProgress(0);
        }
    }
    // -------------------- service --------------------
}